/* 穷尽检查 */
interface Circle13 {
  kind: "circle";
  radius: number;
}

interface Square13 {
  kind: "square";
  sideLength: number;
}

interface Triangle13 {
  kind: "triangle";
  sideLength: number;
}
type Shape13 = Circle13 | Square13 | Triangle13;

// 因为 TypeScript 的收窄特性，
// 执行到 default 的时候，类型被收窄为 Triangle，
// 但因为任何类型都不能赋值给 never 类型，这就会产生一个编译错误。
// 通过这种方式，你就可以确保 getArea 函数总是穷尽了所有 shape 的可能性。
function getArea(shape: Shape13) {
  switch (shape.kind) {
    case "circle":
      return Math.PI * shape.radius ** 2;
    case "square":
      return shape.sideLength ** 2;
    default:
      const _exhaustiveCheck: never = shape;
      return _exhaustiveCheck;
  }
}